package edu.uoc.vmerinom.tfc.report;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jooreports.templates.DocumentTemplateException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Casilla;
import edu.uoc.vmerinom.tfc.domain.Hora;
import edu.uoc.vmerinom.tfc.support.Message;

/**
 * Clase que gestiona la generación de informes a través del servidor de
 * LibreOffice para el módulo de horario.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("horarioReport")
@Scope(ScopeType.CONVERSATION)
public class HorarioReport extends Reports {

	/**
	 * Ruta y nombre de la plantilla.
	 */
	static final String RUTA_PLANTILLA_LISTADO = "/libreoffice/horario.odt";
	/**
	 * Título para la columna hora.
	 */
	static final String TITULO_HORA = "tituloHora";
	/**
	 * Título para la columna "Lunes".
	 */
	static final String TITULO_LUNES = "tituloLunes";
	/**
	 * Título para la columna "Martes"
	 */
	static final String TITULO_MARTES = "tituloMartes";
	/**
	 * Título para la columna "Miércoles"
	 */
	static final String TITULO_MIERCOLES = "tituloMiercoles";
	/**
	 * Título para la columna "Jueves"
	 */
	static final String TITULO_JUEVES = "tituloJueves";
	/**
	 * Título para la columna "Viernes"
	 */
	static final String TITULO_VIERNES = "tituloViernes";
	/**
	 * Título para la columna "Sábado"
	 */
	static final String TITULO_SABADO = "tituloSabado";
	/**
	 * Título para la columna "Domingo"
	 */
	static final String TITULO_DOMINGO = "tituloDomingo";
	/**
	 * Campo horario.
	 */
	static final String CAMPO_HORARIO = "horario";
	/**
	 * Campo hora.
	 */
	static final String CAMPO_HORA = "hora";
	/**
	 * Campo lunes.
	 */
	static final String CAMPO_LUNES = "lunes";
	/**
	 * Campo martes.
	 */
	static final String CAMPO_MARTES = "martes";
	/**
	 * Campo miercoles.
	 */
	static final String CAMPO_MIERCOLES = "miercoles";
	/**
	 * Campo jueves.
	 */
	static final String CAMPO_JUEVES = "jueves";
	/**
	 * Campo viernes.
	 */
	static final String CAMPO_VIERNES = "viernes";
	/**
	 * Campo sabado.
	 */
	static final String CAMPO_SABADO = "sabado";
	/**
	 * Campo domingo.
	 */
	static final String CAMPO_DOMINGO = "domingo";

	/**
	 * Lista con el horario actual. Puede contener horas que estén dadas de
	 * baja.
	 */
	private List<Map<String, Object>> horario;

	/**
	 * Método encargado de la generación del informe de horario. No mostrará las
	 * horas ni las casillas que estén dadas de baja.
	 * 
	 * @throws IOException
	 *             Excepciones de entrada/salida
	 * @throws DocumentTemplateException
	 *             Excepciones producidas por el servidor LibreOffice
	 */
	public void horario() throws IOException, DocumentTemplateException {
		Map<String, Object> mapModel = new HashMap<String, Object>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();
		mapModel.put(FECHA_HORA, sdf.format(date));
		mapModel.put(TITULO_REGISTRO, Message.get("report.timetable.list.title"));
		mapModel.put(TITULO_HORA, Message.get("report.timetable.time"));
		mapModel.put(TITULO_LUNES, Message.get("report.timetable.monday"));
		mapModel.put(TITULO_MARTES, Message.get("report.timetable.tuesday"));
		mapModel.put(TITULO_MIERCOLES, Message.get("report.timetable.wednesday"));
		mapModel.put(TITULO_JUEVES, Message.get("report.timetable.thursday"));
		mapModel.put(TITULO_VIERNES, Message.get("report.timetable.friday"));
		mapModel.put(TITULO_SABADO, Message.get("report.timetable.saturday"));
		mapModel.put(TITULO_DOMINGO, Message.get("report.timetable.sunday"));

		List<Map<String, String>> horas = new ArrayList<Map<String, String>>();
		mapModel.put(CAMPO_HORARIO, horas);
		Map<String, String> fila = null;
		for (Map<String, Object> map : horario) {
			Hora hora = (Hora) map.get(CAMPO_HORA);
			if (hora.getBaja() == null) {
				fila = new HashMap<String, String>();
				fila.put(CAMPO_HORA, getRango(hora));
				Casilla casilla = (Casilla) map.get(CAMPO_LUNES);
				fila.put(CAMPO_LUNES, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_MARTES);
				fila.put(CAMPO_MARTES, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_MIERCOLES);
				fila.put(CAMPO_MIERCOLES, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_JUEVES);
				fila.put(CAMPO_JUEVES, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_VIERNES);
				fila.put(CAMPO_VIERNES, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_SABADO);
				fila.put(CAMPO_SABADO, getGrupo(casilla));
				casilla = (Casilla) map.get(CAMPO_DOMINGO);
				fila.put(CAMPO_DOMINGO, getGrupo(casilla));
				horas.add(fila);
			}
		}

		write(mapModel, "RH", RUTA_PLANTILLA_LISTADO, date);
	}

	/**
	 * Devuelve el nombre del grupo de la casilla que recibe por parámetros. La
	 * casilla deberá ser distinta de <code>null</code>, contener un grupo y no
	 * estar dada de baja.
	 * 
	 * @param casilla
	 *            Casilla seleccionada
	 * @return Nombre del grupo
	 */
	private String getGrupo(Casilla casilla) {
		String grupo = "";
		if (casilla != null && casilla.getGrupo() != null && casilla.getBaja() == null) {
			grupo = casilla.getGrupo().getNombre();
		}
		return grupo;
	}

	/**
	 * Devuelve un cadena con el rango horario de la hora que recibe por
	 * parámetros según el formato <code>HH:mm - HH:mm</code>.
	 * 
	 * @param hora
	 *            Hora seleccionada
	 * @return Rango horario
	 */
	private String getRango(Hora hora) {
		StringBuffer rango = new StringBuffer();
		rango.append(hora.getHoraEntrada());
		rango.append(":");
		if (hora.getMinutoEntrada() < 10) {
			rango.append("0");
		}
		rango.append(hora.getMinutoEntrada());
		rango.append(" - ");
		rango.append(hora.getHoraSalida());
		rango.append(":");
		if (hora.getMinutoSalida() < 10) {
			rango.append("0");
		}
		rango.append(hora.getMinutoSalida());
		return rango.toString();
	}

	public void setHorario(List<Map<String, Object>> horario) {
		this.horario = horario;
	}

	public List<Map<String, Object>> getHorario() {
		return horario;
	}

}
